package 链表.middle;

import java.util.List;

/**
 * @author Lw中
 * @date 2021/7/12 21:15
 */
public class ErSi {

    /**
     * 24. 两两交换链表中的节点
     */

    public class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) {
            this.val = val;
        }
        ListNode(int val, ListNode next) {
            this.val = val; this.next = next;
        }
    }

    public ListNode swapPairs(ListNode head) {
        /*ListNode first = head;
        ListNode second = head.next;
        while (true) {
            ListNode nxt = second.next;
            second.next = first;
            first.next = nxt;
            first =
        }*/
        // new一个前置节点
        ListNode pre = new ListNode(0);
        // 将这个前置节点插入链表头部
        pre.next = head;
        // new一个当前节点
        ListNode temp = pre;
        // 循环终止条件为当前节点的下一个节点和下下个节点不为空
        while (temp.next != null && temp.next.next != null) {
            // 获取当前节点的后两个节点用于交换
            ListNode node1 = temp.next;
            ListNode node2 = temp.next.next;
            // 将当前节点的下一个结点指向node2
            temp.next = node2;
            // 将node1的下一个结点指向node2.next
            node1.next = node2.next;
            // 将node2的节点指向node1
            node2.next = node1;
            // 将当前节点位置向后移两位(因为node1与node2已经交换了位置，所以直接将node1赋值给temp)
            temp = node1;
        }
        return pre.next;
    }

}
